﻿https://postgrespro.ru/docs/postgrespro/12/functions-aggregate

## 9.20. Агрегатные функции
Агрегатные функции получают единственный результат из набора входных значений. Встроенные агрегатные функции общего назначения перечислены в Таблице 9.55, а статистические агрегатные функции — в Таблице 9.56. Встроенные внутригрупповые сортирующие агрегатные функции перечислены в Таблице 9.57, встроенные внутригрупповые гипотезирующие — в Таблице 9.58. Группирующие операторы, тесно связанные с агрегатными функциями, перечислены в Таблице 9.59. Особенности синтаксиса агрегатных функцией разъясняются в Подразделе 4.2.7. За дополнительной вводной информацией обратитесь к Разделу 2.7.

Таблица 9.55. Агрегатные функции общего назначения

| Функция                                  | Типы аргумента                           | Тип результата                           | Частичный режим | Описание                                 |
|------------------------------------------|------------------------------------------|------------------------------------------|-----------------|------------------------------------------|
| <a class="indexterm" id="id-1.5.8.25.4.2.2.1.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">array_agg(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражение</code></em>)</code> | любой тип не массива                     | массив элементов с типом аргумента       | Нет             | входные значения, включая NULL, объединяются в массив |
| <code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">array_agg(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражение</code></em>)</code> | любой тип массива                        | тот же, что и тип аргумента              | Нет             | входные массивы собираются в массив большей размерности (они должны иметь одну размерность и не могут быть пустыми или равны NULL) |
| <a class="indexterm" id="id-1.5.8.25.4.2.2.3.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><a class="indexterm" id="id-1.5.8.25.4.2.2.3.1.2" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">avg(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражение</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">smallint</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">int</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bigint</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">real</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">numeric</code><span> </span>или<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">interval</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">numeric</code><span> </span>для любых целочисленных аргументов,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code><span> </span>для аргументов с плавающей точкой, в противном случае тип данных аргумента | Да              | арифметическое среднее для всех входных значений, отличных от NULL |
| <a class="indexterm" id="id-1.5.8.25.4.2.2.4.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bit_and(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражение</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">smallint</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">int</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bigint</code><span> </span>или<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bit</code> | тот же, что и тип аргумента              | Да              | побитовое И для всех входных значений, не равных NULL, или NULL, если таких нет |
| <a class="indexterm" id="id-1.5.8.25.4.2.2.5.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bit_or(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражение</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">smallint</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">int</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bigint</code><span> </span>или<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bit</code> | тот же, что и тип аргумента              | Да              | побитовое ИЛИ для всех входных значений, не равных NULL, или NULL, если таких нет |
| <a class="indexterm" id="id-1.5.8.25.4.2.2.6.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bool_and(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражение</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bool</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bool</code> | Да              | true, если все входные значения равны true, и false в противном случае |
| <a class="indexterm" id="id-1.5.8.25.4.2.2.7.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bool_or(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражение</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bool</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bool</code> | Да              | true, если хотя бы одно входное значение равно true, и false в противном случае |
| <a class="indexterm" id="id-1.5.8.25.4.2.2.8.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">count(*)</code> |                                          | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bigint</code> | Да              | количество входных строк                 |
| <code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">count(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражение</code></em>)</code> | any                                      | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bigint</code> | Да              | количество входных строк, для которых значение<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражения</code></em><span> </span>не равно NULL |
| <a class="indexterm" id="id-1.5.8.25.4.2.2.10.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">every(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражение</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bool</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bool</code> | Да              | синоним<span> </span><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bool_and</code> |
| <a class="indexterm" id="id-1.5.8.25.4.2.2.11.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">json_agg(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражение</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">any</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">json</code> | Нет             | агрегирует значения, включая NULL, в виде массива JSON |
| <a class="indexterm" id="id-1.5.8.25.4.2.2.12.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">jsonb_agg(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражение</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">any</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">jsonb</code> | Нет             | агрегирует значения, включая NULL, в виде массива JSON |
| <a class="indexterm" id="id-1.5.8.25.4.2.2.13.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">json_object_agg(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">имя</code></em>,<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">значение</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">(any, any)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">json</code> | Нет             | агрегирует пары имя/значение в виде объекта JSON (NULL допускается в значениях, но не в именах) |
| <a class="indexterm" id="id-1.5.8.25.4.2.2.14.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">jsonb_object_agg(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">имя</code></em>,<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">значение</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">(any, any)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">jsonb</code> | Нет             | агрегирует пары имя/значение в виде объекта JSON (NULL допускается в значениях, но не в именах) |
| <a class="indexterm" id="id-1.5.8.25.4.2.2.15.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">max(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражение</code></em>)</code> | любой числовой, строковый, сетевой тип или тип даты/времени, либо массив этих типов | тот же, что и тип аргумента              | Да              | максимальное значение<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражения</code></em><span> </span>среди всех входных данных, отличных от NULL |
| <a class="indexterm" id="id-1.5.8.25.4.2.2.16.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">min(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражение</code></em>)</code> | любой числовой, строковый, сетевой тип или тип даты/времени, либо массив этих типов | тот же, что и тип аргумента              | Да              | минимальное значение<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражения</code></em><span> </span>среди всех входных данных, отличных от NULL |
| <a class="indexterm" id="id-1.5.8.25.4.2.2.17.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">string_agg(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражение</code></em>,<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">разделитель</code></em>)</code> | (<code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">text</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">text</code>) или (<code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bytea</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bytea</code>) | тот же, что и типы аргументов            | Нет             | входные данные (исключая NULL) складываются в строку через заданный разделитель |
| <a class="indexterm" id="id-1.5.8.25.4.2.2.18.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">sum(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражение</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">smallint</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">int</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bigint</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">real</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">numeric</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">interval</code><span> </span>или<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">money</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bigint</code><span> </span>для аргументов<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">smallint</code><span> </span>или<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">int</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">numeric</code><span> </span>для аргументов<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bigint</code>, и тип аргумента в остальных случаях | Да              | сумма значений<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражения</code></em><span> </span>по всем входным данным, отличным от NULL |
| <a class="indexterm" id="id-1.5.8.25.4.2.2.19.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">xmlagg(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражение</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">xml</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">xml</code> | Нет             | соединение XML-значений, отличных от NULL (см. также<span> </span><a class="xref" href="https://postgrespro.ru/docs/postgrespro/12/functions-xml#FUNCTIONS-XML-XMLAGG" title="9.14.1.7. xmlagg" style="box-sizing: border-box; background-color: transparent; color: rgb(0, 145, 208); text-decoration: underline; cursor: url(&quot;&quot;) 14 0, auto !important;">Подраздел 9.14.1.7</a>) |

Следует заметить, что за исключением count, все эти функции возвращают NULL, если для них не была выбрана ни одна строка. В частности, функция sum, не получив строк, возвращает NULL, а не 0, как можно было бы ожидать, и array_agg в этом случае возвращает NULL, а не пустой массив. Если необходимо, подставить в результат 0 или пустой массив вместо NULL можно с помощью функции coalesce.

Агрегатные функции, поддерживающие частичный режим, являются кандидатами на участие в различных оптимизациях, например, в параллельном агрегировании.

> Примечание
Булевы агрегатные функции bool_and и bool_or соответствуют стандартным SQL-агрегатам every и any или some. Что касается any и some, по стандарту их синтаксис допускает некоторую неоднозначность:

    SELECT b1 = ANY((SELECT b2 FROM t2 ...)) FROM t1 ...;
Здесь ANY можно рассматривать и как объявление подзапроса, и как агрегатную функцию, если этот подзапрос возвращает одну строку с булевым значением. Таким образом, этим агрегатным функциям нельзя было дать стандартные имена.

> Примечание
Пользователи с опытом использования других СУБД SQL могут быть недовольны скоростью агрегатной функции count, когда она применяется ко всей таблице. Подобный запрос:

SELECT count(*) FROM sometable;
потребует затрат в количестве, пропорциональном размеру таблицы: Postgres Pro придётся полностью просканировать либо всю таблицу, либо один из индексов, включающий все её строки.

Агрегатные функции array_agg, json_agg, jsonb_agg, json_object_agg, jsonb_object_agg, string_agg и xmlagg так же, как и подобные пользовательские агрегатные функции, выдают разные по содержанию результаты в зависимости от порядка входных значений. По умолчанию порядок не определён, но его можно задать, дополнив вызов агрегатной функции предложением ORDER BY, как описано в Подразделе 4.2.7. Обычно нужного результата также можно добиться, передав для агрегирования результат подзапроса с сортировкой. Например:

    SELECT xmlagg(x) FROM (SELECT x FROM test ORDER BY y DESC) AS tab;
Но учтите, что этот подход может не работать, если на внешнем уровне запроса выполняется дополнительная обработка, например, соединение, так как при этом результат подзапроса может быть переупорядочен перед вычислением агрегатной функции.

В Таблице 9.56 перечислены агрегатные функции, обычно применяемые в статистическом анализе. (Они выделены просто для того, чтобы не загромождать список наиболее популярных агрегатных функций.) В их описании под N подразумевается число входных строк, для которых входные выражения не равны NULL. Все эти функции возвращают NULL во всех случаях, когда вычисление бессмысленно, например, когда N равно 0.

Таблица 9.56. Агрегатные функции для статистических вычислений

| Функция                                  | Тип аргумента                            | Тип результата                           | Частичный режим | Описание                                 |
|------------------------------------------|------------------------------------------|------------------------------------------|-----------------|------------------------------------------|
| <a class="indexterm" id="id-1.5.8.25.13.2.2.1.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><a class="indexterm" id="id-1.5.8.25.13.2.2.1.1.2" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">corr(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">Y</code></em>,<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">X</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code> | Да              | коэффициент корреляции                   |
| <a class="indexterm" id="id-1.5.8.25.13.2.2.2.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><a class="indexterm" id="id-1.5.8.25.13.2.2.2.1.2" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">covar_pop(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">Y</code></em>,<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">X</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code> | Да              | ковариация совокупности                  |
| <a class="indexterm" id="id-1.5.8.25.13.2.2.3.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><a class="indexterm" id="id-1.5.8.25.13.2.2.3.1.2" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">covar_samp(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">Y</code></em>,<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">X</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code> | Да              | ковариация выборки                       |
| <a class="indexterm" id="id-1.5.8.25.13.2.2.4.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">regr_avgx(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">Y</code></em>,<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">X</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code> | Да              | среднее независимой переменной (<code class="literal" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">sum(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">X</code></em>)/<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">N</code></em></code>) |
| <a class="indexterm" id="id-1.5.8.25.13.2.2.5.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">regr_avgy(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">Y</code></em>,<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">X</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code> | Да              | среднее зависимой переменной (<code class="literal" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">sum(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">Y</code></em>)/<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">N</code></em></code>) |
| <a class="indexterm" id="id-1.5.8.25.13.2.2.6.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">regr_count(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">Y</code></em>,<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">X</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bigint</code> | Да              | число входных строк, в которых оба выражения не NULL |
| <a class="indexterm" id="id-1.5.8.25.13.2.2.7.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><a class="indexterm" id="id-1.5.8.25.13.2.2.7.1.2" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">regr_intercept(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">Y</code></em>,<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">X</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code> | Да              | пересечение с осью OY линии, полученной методом наименьших квадратов по данным (<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">X</code></em>,<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">Y</code></em>) |
| <a class="indexterm" id="id-1.5.8.25.13.2.2.8.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">regr_r2(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">Y</code></em>,<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">X</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code> | Да              | квадрат коэффициента корреляции          |
| <a class="indexterm" id="id-1.5.8.25.13.2.2.9.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><a class="indexterm" id="id-1.5.8.25.13.2.2.9.1.2" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">regr_slope(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">Y</code></em>,<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">X</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code> | Да              | наклон линии, полученной методом наименьших квадратов по данным (<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">X</code></em>,<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">Y</code></em>) |
| <a class="indexterm" id="id-1.5.8.25.13.2.2.10.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">regr_sxx(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">Y</code></em>,<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">X</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code> | Да              | <code class="literal" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">sum(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">X</code></em>^2) - sum(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">X</code></em>)^2/<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">N</code></em></code><span> </span>(<span class="quote" style="box-sizing: border-box; cursor: url(&quot;&quot;) 0 0, auto !important;">«<span class="quote" style="box-sizing: border-box; cursor: url(&quot;&quot;) 0 0, auto !important;">сумма квадратов</span>»</span><span> </span>независимой переменной) |
| <a class="indexterm" id="id-1.5.8.25.13.2.2.11.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">regr_sxy(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">Y</code></em>,<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">X</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code> | Да              | <code class="literal" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">sum(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">X</code></em>*<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">Y</code></em>) - sum(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">X</code></em>) * sum(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">Y</code></em>)/<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">N</code></em></code><span> </span>(<span class="quote" style="box-sizing: border-box; cursor: url(&quot;&quot;) 0 0, auto !important;">«<span class="quote" style="box-sizing: border-box; cursor: url(&quot;&quot;) 0 0, auto !important;">сумма произведений</span>»</span><span> </span>независимых и зависимых переменных) |
| <a class="indexterm" id="id-1.5.8.25.13.2.2.12.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">regr_syy(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">Y</code></em>,<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">X</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code> | Да              | <code class="literal" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">sum(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">Y</code></em>^2) - sum(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">Y</code></em>)^2/<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">N</code></em></code><span> </span>(<span class="quote" style="box-sizing: border-box; cursor: url(&quot;&quot;) 0 0, auto !important;">«<span class="quote" style="box-sizing: border-box; cursor: url(&quot;&quot;) 0 0, auto !important;">сумма квадратов</span>»</span><span> </span>зависимой переменной) |
| <a class="indexterm" id="id-1.5.8.25.13.2.2.13.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><a class="indexterm" id="id-1.5.8.25.13.2.2.13.1.2" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">stddev(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражение</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">smallint</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">int</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bigint</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">real</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code><span> </span>или<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">numeric</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code><span> </span>для аргументов с плавающей точкой,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">numeric</code><span> </span>для остальных | Да              | сохранившийся синоним<span> </span><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">stddev_samp</code> |
| <a class="indexterm" id="id-1.5.8.25.13.2.2.14.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><a class="indexterm" id="id-1.5.8.25.13.2.2.14.1.2" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">stddev_pop(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражение</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">smallint</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">int</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bigint</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">real</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code><span> </span>или<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">numeric</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code><span> </span>для аргументов с плавающей точкой,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">numeric</code><span> </span>для остальных | Да              | стандартное отклонение по генеральной совокупности входных значений |
| <a class="indexterm" id="id-1.5.8.25.13.2.2.15.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><a class="indexterm" id="id-1.5.8.25.13.2.2.15.1.2" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">stddev_samp(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражение</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">smallint</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">int</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bigint</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">real</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code><span> </span>или<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">numeric</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code><span> </span>для аргументов с плавающей точкой,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">numeric</code><span> </span>для остальных | Да              | стандартное отклонение по выборке входных значений |
| <a class="indexterm" id="id-1.5.8.25.13.2.2.16.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">variance</code>(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражение</code></em>) | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">smallint</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">int</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bigint</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">real</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code><span> </span>или<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">numeric</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code><span> </span>для аргументов с плавающей точкой,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">numeric</code><span> </span>для остальных | Да              | сохранившийся синоним<span> </span><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">var_samp</code> |
| <a class="indexterm" id="id-1.5.8.25.13.2.2.17.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><a class="indexterm" id="id-1.5.8.25.13.2.2.17.1.2" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">var_pop</code>(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражение</code></em>) | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">smallint</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">int</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bigint</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">real</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code><span> </span>или<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">numeric</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code><span> </span>для аргументов с плавающей точкой,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">numeric</code><span> </span>для остальных | Да              | дисперсия для генеральной совокупности входных значений (квадрат стандартного отклонения) |
| <a class="indexterm" id="id-1.5.8.25.13.2.2.18.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><a class="indexterm" id="id-1.5.8.25.13.2.2.18.1.2" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">var_samp</code>(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражение</code></em>) | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">smallint</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">int</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bigint</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">real</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code><span> </span>или<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">numeric</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code><span> </span>для аргументов с плавающей точкой,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">numeric</code><span> </span>для остальных | Да              | дисперсия по выборке для входных значений (квадрат отклонения по выборке) |


В Таблице 9.57 показаны некоторые агрегатные функции, использующие синтаксис сортирующих агрегатных функций. Иногда такие функции функциями называют функциями «обратного распределения».

Таблица 9.57. Сортирующие агрегатные функции

| Функция                                  | Тип непосредственного аргумента          | Тип агрегированного аргумента            | Тип результата                     | Частичный режим | Описание                                 |
|------------------------------------------|------------------------------------------|------------------------------------------|------------------------------------|-----------------|------------------------------------------|
| <a class="indexterm" id="id-1.5.8.25.17.2.2.1.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">mode() WITHIN GROUP (ORDER BY<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражение_сортировки</code></em>)</code> |                                          | любой сортируемый тип                    | тот же, что у выражения сортировки | Нет             | возвращает значение, наиболее часто встречающееся во входных данных (если одинаково часто встречаются несколько значений, произвольно выбирается первое из них) |
| <a class="indexterm" id="id-1.5.8.25.17.2.2.2.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">percentile_cont(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">дробь</code></em>) WITHIN GROUP (ORDER BY<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражение_сортировки</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code><span> </span>или<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">interval</code> | тот же, что у выражения сортировки | Нет             | непрерывный процентиль: возвращает значение, соответствующее заданной дроби по порядку, интерполируя соседние входные значения, если необходимо |
| <code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">percentile_cont(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">дроби</code></em>) WITHIN GROUP (ORDER BY<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражение_сортировки</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision[]</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code><span> </span>или<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">interval</code> | массив типа выражения сортировки   | Нет             | множественный непрерывный процентиль: возвращает массив результатов, соответствующих форме параметра<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">дроби</code></em><span> </span>(для каждого элемента не NULL подставляется значение, соответствующее данному процентилю) |
| <a class="indexterm" id="id-1.5.8.25.17.2.2.4.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">percentile_disc(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">дробь</code></em>) WITHIN GROUP (ORDER BY<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражение_сортировки</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code> | любой сортируемый тип                    | тот же, что у выражения сортировки | Нет             | дискретный процентиль: возвращает первое значение из входных данных, позиция которого по порядку равна или превосходит указанную дробь |
| <code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">percentile_disc(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">дроби</code></em>) WITHIN GROUP (ORDER BY<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">выражение_сортировки</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision[]</code> | любой сортируемый тип                    | массив типа выражения сортировки   | Нет             | множественный дискретный процентиль: возвращает массив результатов, соответствующих форме параметра<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">дроби</code></em><span> </span>(для каждого элемента не NULL подставляется входное значение, соответствующее данному процентилю) |

Все агрегатные функции, перечисленные в Таблице 9.57, игнорируют значения NULL при сортировке данных. Для функций, принимающих параметр дробь, значение этого параметра должно быть от 0 до 1; в противном случае возникает ошибка. Однако, если в этом параметре передаётся NULL, эти функции просто выдают NULL.

Все агрегатные функции, перечисленные в Таблице 9.58, связаны с одноимёнными оконными функциями, определёнными в Разделе 9.21. В каждом случае их результат — значение, которое вернула бы связанная оконная функция для «гипотетической» строки, полученной из аргументов, если бы такая строка была добавлена в сортированную группу строк, которую образуют сортированные_аргументы.

Таблица 9.58. Гипотезирующие агрегатные функции

| Функция                                  | Тип непосредственного аргумента          | Тип агрегированного аргумента            | Тип результата                           | Частичный режим | Описание                                 |
|------------------------------------------|------------------------------------------|------------------------------------------|------------------------------------------|-----------------|------------------------------------------|
| <a class="indexterm" id="id-1.5.8.25.21.2.2.1.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">rank(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">аргументы</code></em>) WITHIN GROUP (ORDER BY<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">сортированные_аргументы</code></em>)</code> | <code class="literal" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">VARIADIC</code><span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">"any"</code> | <code class="literal" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">VARIADIC</code><span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">"any"</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bigint</code> | Нет             | ранг гипотетической строки, с пропусками повторяющихся строк |
| <a class="indexterm" id="id-1.5.8.25.21.2.2.2.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">dense_rank(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">аргументы</code></em>) WITHIN GROUP (ORDER BY<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">сортированные_аргументы</code></em>)</code> | <code class="literal" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">VARIADIC</code><span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">"any"</code> | <code class="literal" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">VARIADIC</code><span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">"any"</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bigint</code> | Нет             | ранг гипотетической строки, без пропусков |
| <a class="indexterm" id="id-1.5.8.25.21.2.2.3.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">percent_rank(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">аргументы</code></em>) WITHIN GROUP (ORDER BY<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">сортированные_аргументы</code></em>)</code> | <code class="literal" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">VARIADIC</code><span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">"any"</code> | <code class="literal" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">VARIADIC</code><span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">"any"</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code> | Нет             | относительный ранг гипотетической строки, от 0 до 1 |
| <a class="indexterm" id="id-1.5.8.25.21.2.2.4.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">cume_dist(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">аргументы</code></em>) WITHIN GROUP (ORDER BY<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">сортированные_аргументы</code></em>)</code> | <code class="literal" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">VARIADIC</code><span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">"any"</code> | <code class="literal" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">VARIADIC</code><span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">"any"</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code> | Нет             | относительный ранг гипотетической строки, от 1/<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">N</code></em><span> </span>до 1 |

Для всех этих гипотезирующих агрегатных функций непосредственные аргументы должны соответствовать (по количеству и типу) сортированным_аргументам. В отличие от встроенных агрегатных функций, они не являются строгими, то есть не отбрасывают входные строки, содержащие NULL. Значения NULL сортируются согласно правилу, указанному в предложении ORDER BY.

Таблица 9.59. Операции группировки

| Функция                                  | Тип результата                           | Описание                                 |
|------------------------------------------|------------------------------------------|------------------------------------------|
| <a class="indexterm" id="id-1.5.8.25.23.2.2.1.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">GROUPING(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">аргументы...</code></em>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">integer</code> | Целочисленная битовая маска, показывающая, какие аргументы не вошли в текущий набор группирования |

Операции группировки применяются в сочетании с наборами группирования (см. Подраздел 7.2.4) для различения результирующих строк. Аргументы операции GROUPING на самом деле не вычисляются, но они должны в точности соответствовать выражениям, заданным в предложении GROUP BY на их уровне запроса. Биты назначаются справа налево (правый аргумент отражается в младшем бите); бит равен 0, если соответствующее выражение вошло в критерий группировки набора группирования, для которого сформирована строка результата, или 1 в противном случае. Например:

    => SELECT * FROM items_sold;
     make  | model | sales
    -------+-------+-------
     Foo   | GT    |  10
     Foo   | Tour  |  20
     Bar   | City  |  15
     Bar   | Sport |  5
    (4 rows)
    
    => SELECT make, model, GROUPING(make,model), sum(sales) FROM items_sold GROUP BY ROLLUP(make,model);
     make  | model | grouping | sum
    -------+-------+----------+-----
     Foo   | GT    |        0 | 10
     Foo   | Tour  |        0 | 20
     Bar   | City  |        0 | 15
     Bar   | Sport |        0 | 5
     Foo   |       |        1 | 30
     Bar   |       |        1 | 20
           |       |        3 | 50
    (7 rows)
     
9.21. Оконные функции
Оконные функции дают возможность выполнять вычисления с набором строк, каким-либо образом связанным с текущей строкой запроса. Вводную информацию об этом можно получить в Разделе 3.5, а подробнее узнать о синтаксисе можно в Подразделе 4.2.8.

Встроенные оконные функции перечислены в Таблице 9.60. Заметьте, что эти функции должны вызываться именно как оконные, т. е. при вызове необходимо использовать предложение OVER.

В дополнение к этим функциям в качестве оконных можно использовать любые встроенные или пользовательские универсальные или статистические агрегатные функции (но не сортирующие и не гипотезирующие); список встроенных агрегатных функций приведён в Разделе 9.20. Агрегатные функции работают как оконные, только когда за их вызовом следует предложение OVER; в противном случае они работают как обычные, не оконные функции и выдают для всего набора единственную строку.

Таблица 9.60. Оконные функции общего назначения

| ункция                                   | Тип результата                           | Описание                                 |
|------------------------------------------|------------------------------------------|------------------------------------------|
| <a class="indexterm" id="id-1.5.8.26.6.2.2.1.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">row_number()</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bigint</code> | номер текущей строки в её разделе, начиная с 1 |
| <a class="indexterm" id="id-1.5.8.26.6.2.2.2.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">rank()</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bigint</code> | ранг текущей строки с пропусками; то же, что и<span> </span><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">row_number</code><span> </span>для первой родственной ей строки |
| <a class="indexterm" id="id-1.5.8.26.6.2.2.3.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">dense_rank()</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bigint</code> | ранг текущей строки без пропусков; эта функция считает группы родственных строк |
| <a class="indexterm" id="id-1.5.8.26.6.2.2.4.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">percent_rank()</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code> | относительный ранг текущей строки: (<code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">rank</code><span> </span>- 1) / (общее число строк раздела - 1) |
| <a class="indexterm" id="id-1.5.8.26.6.2.2.5.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">cume_dist()</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">double precision</code> | кумулятивное распределение: (число строк раздела, предшествующих или родственных текущей строке) / общее число строк раздела |
| <a class="indexterm" id="id-1.5.8.26.6.2.2.6.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">ntile(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">число_групп</code></em><span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">integer</code>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">integer</code> | ранжирование по целым числам от 1 до значения аргумента так, чтобы размеры групп были максимально близки |
| <a class="indexterm" id="id-1.5.8.26.6.2.2.7.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">lag(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">значение</code></em><span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">anyelement</code><span> </span>[,<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">смещение</code></em><span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">integer</code><span> </span>[,<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">по_умолчанию</code></em><span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">anyelement</code><span> </span>]])</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">тип аргумента<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">значение</code></em></code> | возвращает<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">значение</code></em><span> </span>для строки, положение которой задаётся<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">смещением</code></em><span> </span>от текущей строки к началу раздела; если такой строки нет, возвращается значение<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">по_умолчанию</code></em><span> </span>(оно должно иметь тот же тип, что и<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">значение</code></em>). Оба параметра<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">смещение</code></em><span> </span>и<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">по_умолчанию</code></em><span> </span>вычисляются для текущей строки. Если они не указываются, то<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">смещение</code></em><span> </span>считается равным 1, а<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">по_умолчанию</code></em><span> </span>— NULL |
| <a class="indexterm" id="id-1.5.8.26.6.2.2.8.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">lead(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">значение</code></em><span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">anyelement</code><span> </span>[,<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">смещение</code></em><span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">integer</code><span> </span>[,<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">по_умолчанию</code></em><span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">anyelement</code><span> </span>]])</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">тип аргумента<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">значение</code></em></code> | возвращает<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">значение</code></em><span> </span>для строки, положение которой задаётся<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">смещением</code></em><span> </span>от текущей строки к концу раздела; если такой строки нет, возвращается значение<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">по_умолчанию</code></em><span> </span>(оно должно иметь тот же тип, что и<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">значение</code></em>). Оба параметра<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">смещение</code></em><span> </span>и<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">по_умолчанию</code></em><span> </span>вычисляются для текущей строки. Если они не указываются, то<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">смещение</code></em><span> </span>считается равным 1, а<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">по_умолчанию</code></em><span> </span>— NULL |
| <a class="indexterm" id="id-1.5.8.26.6.2.2.9.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">first_value(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">значение</code></em><span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">any</code>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">тип аргумента<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">значение</code></em></code> | возвращает<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">значение</code></em>, вычисленное для первой строки в рамке окна |
| <a class="indexterm" id="id-1.5.8.26.6.2.2.10.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">last_value(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">значение</code></em><span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">any</code>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">тип аргумента<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">значение</code></em></code> | возвращает<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">значение</code></em>, вычисленное для последней строки в рамке окна |
| <a class="indexterm" id="id-1.5.8.26.6.2.2.11.1.1" style="box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration: none;"></a><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">nth_value(<em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">значение</code></em><span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">any</code>,<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">n</code></em><span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">integer</code>)</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">тип аргумента<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">значение</code></em></code> | возвращает<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">значение</code></em>, вычисленное в<span> </span><em class="replaceable" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">н-ой</code></em><span> </span>строке в рамке окна (считая с 1), или NULL, если такой строки нет |


Результат всех функций, перечисленных в Таблице 9.60, зависит от порядка сортировки, заданного предложением ORDER BY в определении соответствующего окна. Строки, которые являются одинаковыми при рассмотрении только столбцов ORDER BY, считаются родственными. Четыре функции, вычисляющие ранг (включая cume_dist), реализованы так, что их результат будет одинаковым для всех родственных строк.

Заметьте, что функции first_value, last_value и nth_value рассматривают только строки в «рамке окна», которая по умолчанию содержит строки от начала раздела до последней родственной строки для текущей. Поэтому результаты last_value и иногда nth_value могут быть не очень полезны. В таких случаях можно переопределить рамку, добавив в предложение OVER подходящее указание рамки (RANGE, ROWS или GROUPS). Подробнее эти указания описаны в Подразделе 4.2.8.

Когда в качестве оконной функции используется агрегатная, она обрабатывает строки в рамке текущей строки. Агрегатная функция с ORDER BY и определением рамки окна по умолчанию будет вычисляться как «бегущая сумма», что может не соответствовать желаемому результату. Чтобы агрегатная функция работала со всем разделом, следует опустить ORDER BY или использовать ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING. Используя другие указания в определении рамки, можно получить и другие эффекты.

> Примечание
В стандарте SQL определены параметры RESPECT NULLS или IGNORE NULLS для функций lead, lag, first_value, last_value и nth_value. В Postgres Pro такие параметры не реализованы: эти функции ведут себя так, как положено в стандарте по умолчанию (или с подразумеваемым параметром RESPECT NULLS). Также функция nth_value не поддерживает предусмотренные стандартом параметры FROM FIRST и FROM LAST: реализовано только поведение по умолчанию (с подразумеваемым параметром FROM FIRST). (Получить эффект параметра FROM LAST можно, изменив порядок ORDER BY на обратный.)

Функция cume_dist вычисляет процент строк раздела, которые меньше или равны текущей строке или родственным ей строкам, тогда как percent_rank вычисляет процент строк раздела, которые меньше текущей строки, в предположении, что текущая строка не относится к разделу.

## 9.22. Выражения подзапросов

В этом разделе описаны выражения подзапросов, которые реализованы в Postgres Pro в соответствии со стандартом SQL. Все рассмотренные здесь формы выражений возвращает булевы значения (true/false).

### 9.22.1. EXISTS
    EXISTS (подзапрос)
Аргументом EXISTS является обычный оператор SELECT, т. е. подзапрос. Выполнив запрос, система проверяет, возвращает ли он строки в результате. Если он возвращает минимум одну строку, результатом EXISTS будет «true», а если не возвращает ни одной — «false».

Подзапрос может обращаться к переменным внешнего запроса, которые в рамках одного вычисления подзапроса считаются константами.

Вообще говоря, подзапрос может выполняться не полностью, а завершаться, как только будет возвращена хотя бы одна строка. Поэтому в подзапросах следует избегать побочных эффектов (например, обращений к генераторам последовательностей); проявление побочного эффекта может быть непредсказуемым.

Так как результат этого выражения зависит только от того, возвращаются строки или нет, но не от их содержимого, список выходных значений подзапроса обычно не имеет значения. Как следствие, широко распространена практика, когда проверки EXISTS записываются в форме EXISTS(SELECT 1 WHERE ...). Однако из этого правила есть и исключения, например с подзапросами с предложением INTERSECT.

Этот простой пример похож на внутреннее соединение по столбцу col2, но он выдаёт максимум одну строку для каждой строки в tab1, даже если в tab2 ей соответствуют несколько строк:

    SELECT col1
    FROM tab1
    WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
### 9.22.2. IN
    выражение IN (подзапрос)
В правой стороне этого выражения в скобках задаётся подзапрос, который должен возвращать ровно один столбец. Вычисленное значение левого выражения сравнивается со значениями во всех строках, возвращённых подзапросом. Результатом всего выражения IN будет «true», если строка с таким значением находится, и «false» в противном случае (в том числе, когда подзапрос вообще не возвращает строк).

Заметьте, что если результатом выражения слева оказывается NULL или равных значений справа не находится, а хотя бы одно из значений справа равно NULL, конструкция IN возвращает NULL, а не false. Это соответствует принятым в SQL правилам сравнения переменных со значениями NULL.

Так же, как и с EXISTS, здесь не следует рассчитывать на то, что подзапрос будет всегда выполняться полностью.

    конструктор_строки IN (подзапрос)
В левой части этой формы IN записывается конструктор строки (подробнее они рассматриваются в Подразделе 4.2.13). Справа в скобках записывается подзапрос, который должен вернуть ровно столько столбцов, сколько содержит строка в выражении слева. Вычисленные значения левого выражения сравниваются построчно со значениями во всех строках, возвращённых подзапросом. Результатом всего выражения IN будет «true», если строка с такими значениями находится, и «false» в противном случае (в том числе, когда подзапрос вообще не возвращает строк).

Как обычно, значения NULL в строках обрабатываются при этом по принятым в SQL правилам сравнения. Две строки считаются равными, если все их соответствующие элементы не равны NULL, но равны между собой; неравными они считаются, когда в них находятся элементы, не равные NULL, и не равные друг другу; в противном случае результат сравнения строк не определён (равен NULL). Если в результатах сравнения строк нет ни одного положительного, но есть хотя бы один NULL, результатом IN будет NULL.

### 9.22.3. NOT IN
    выражение NOT IN (подзапрос)
Справа в скобках записывается подзапрос, который должен возвращать ровно один столбец. Вычисленное значение левого выражения сравнивается со значением во всех строках, возвращённых подзапросом. Результатом всего выражения NOT IN будет «true», если находятся только несовпадающие строки (в том числе, когда подзапрос вообще не возвращает строк). Если же находится хотя бы одна подходящая строка, результатом будет «false».

Заметьте, что если результатом выражения слева оказывается NULL или равных значений справа не находится, а хотя бы одно из значений справа равно NULL, конструкция NOT IN возвращает NULL, а не true. Это соответствует принятым в SQL правилам сравнения переменных со значениями NULL.

Так же, как и с EXISTS, здесь не следует рассчитывать на то, что подзапрос будет всегда выполняться полностью.

    конструктор_строки NOT IN (подзапрос)
В левой части этой формы NOT IN записывается конструктор строки (подробнее они описываются в Подразделе 4.2.13). Справа в скобках записывается подзапрос, который должен вернуть ровно столько столбцов, сколько содержит строка в выражении слева. Вычисленные значения левого выражения сравниваются построчно со значениями во всех строках, возвращённых подзапросом. Результатом всего выражения NOT IN будет «true», если равных строк не найдётся (в том числе, и когда подзапрос не возвращает строк), и «false», если такие строки есть.

Как обычно, значения NULL в строках обрабатываются при этом по принятым в SQL правилам сравнения. Две строки считаются равными, если все их соответствующие элементы не равны NULL, но равны между собой; неравными они считаются, когда в них находятся элементы, не равные NULL, и не равные друг другу; в противном случае результат сравнения строк не определён (равен NULL). Если в результатах сравнения строк нет ни одного положительного, но есть хотя бы один NULL, результатом NOT IN будет NULL.

### 9.22.4. ANY/SOME
выражение оператор ANY (подзапрос)
выражение оператор SOME (подзапрос)
В правой части конструкции в скобках записывается подзапрос, который должен возвращать ровно один столбец. Вычисленное значение левого выражения сравнивается со значением в каждой строке результата подзапроса с помощью заданного оператора условия, который должен выдавать логическое значение. Результатом ANY будет «true», если хотя бы для одной строки условие истинно, и «false» в противном случае (в том числе, и когда подзапрос не возвращает строк).

Ключевое слово SOME является синонимом ANY. Конструкцию IN можно также записать как = ANY.

Заметьте, что если условие не выполняется ни для одной из строк, а хотя бы для одной строки условный оператор выдаёт NULL, конструкция ANY возвращает NULL, а не false. Это соответствует принятым в SQL правилам сравнения переменных со значениями NULL.

Так же, как и с EXISTS, здесь не следует рассчитывать на то, что подзапрос будет всегда выполняться полностью.

    конструктор_строки оператор ANY (подзапрос)
    конструктор_строки оператор SOME (подзапрос)
В левой части этой формы ANY записывается конструктор строки (подробнее они описываются в Подразделе 4.2.13). Справа в скобках записывается подзапрос, который должен возвращать ровно столько столбцов, сколько содержит строка в выражении слева. Вычисленные значения левого выражения сравниваются построчно со значениями во всех строках, возвращённых подзапросом, с применением заданного оператора. Результатом всего выражения ANY будет «true», если для какой-либо из строк подзапроса результатом сравнения будет true, или «false», если для всех строк результатом сравнения оказывается false (в том числе, и когда подзапрос не возвращает строк). Результатом выражения будет NULL, если ни для одной из строк подзапроса результат сравнения не равен true, а минимум для одной равен NULL.

Подробнее логика сравнения конструкторов строк описана в Подразделе 9.23.5.

### 9.22.5. ALL
выражение оператор ALL (подзапрос)
В правой части конструкции в скобках записывается подзапрос, который должен возвращать ровно один столбец. Вычисленное значение левого выражения сравнивается со значением в каждой строке результата подзапроса с помощью заданного оператора условия, который должен выдавать логическое значение. Результатом ALL будет «true», если условие истинно для всех строк (и когда подзапрос не возвращает строк), или «false», если находятся строки, для которых оно ложно. Результатом выражения будет NULL, если ни для одной из строк подзапроса результат сравнения не равен true, а минимум для одной равен NULL.

Конструкция NOT IN равнозначна <> ALL.

Так же, как и с EXISTS, здесь не следует рассчитывать на то, что подзапрос будет всегда выполняться полностью.

    конструктор_строки оператор ALL (подзапрос)
В левой части этой формы ALL записывается конструктор строки (подробнее они описываются в Подразделе 4.2.13). Справа в скобках записывается подзапрос, который должен возвращать ровно столько столбцов, сколько содержит строка в выражении слева. Вычисленные значения левого выражения сравниваются построчно со значениями во всех строках, возвращённых подзапросом, с применением заданного оператора. Результатом всего выражения ALL будет «true», если для всех строк подзапроса результатом сравнения будет true (или если подзапрос не возвращает строк), либо «false», если результат сравнения равен false для любой из строк подзапроса. Результатом выражения будет NULL, если ни для одной из строк подзапроса результат сравнения не равен true, а минимум для одной равен NULL.

Подробнее логика сравнения конструкторов строк описана в Подразделе 9.23.5.

### 9.22.6. Сравнение единичных строк
    конструктор_строки оператор (подзапрос)
В левой части конструкции записывается конструктор строки (подробнее они описываются в Подразделе 4.2.13). Справа в скобках записывается подзапрос, который должен возвращать ровно столько столбцов, сколько содержит строка в выражении слева. Более того, подзапрос может вернуть максимум одну строку. (Если он не вернёт строк, результатом будет NULL.) Конструкция возвращает результат сравнения строки слева с этой одной строкой результата подзапроса.

Подробнее логика сравнения конструкторов строк описана в Подразделе 9.23.5.

## 9.23. Сравнение табличных строк и массивов

В этом разделе описываются несколько специальных конструкций, позволяющих сравнивать группы значений. Синтаксис этих конструкций связан с формами выражений с подзапросами, описанными в предыдущем разделе, а отличаются они отсутствием подзапросов. Конструкции, в которых в качестве подвыражений используются массивы, являются расширениями Postgres Pro; все остальные формы соответствуют стандарту SQL. Все описанные здесь выражения возвращают логические значения (true/false).

### 9.23.1. IN

выражение IN (значение [, ...])
Справа в скобках записывается список скалярных выражений. Результатом будет «true», если значение левого выражения равняется одному из значений выражений в правой части. Эту конструкцию можно считать краткой записью условия

    выражение = значение1
    OR
    выражение = значение2
    OR
    ...
Заметьте, что если результатом выражения слева оказывается NULL или равных значений справа не находится, а хотя бы одно из значений справа равно NULL, конструкция IN возвращает NULL, а не false. Это соответствует принятым в SQL правилам сравнения переменных со значениями NULL.

### 9.23.2. NOT IN
    выражение NOT IN (значение [, ...])
Справа в скобках записывается список скалярных выражений. Результатом будет «true», если значение левого выражения не равно ни одному из значений выражений в правой части. Эту конструкцию можно считать краткой записью условия

    выражение <> значение1
    AND
    выражение <> значение2
    AND
    ...
Заметьте, что если результатом выражения слева оказывается NULL или равных значений справа не находится, а хотя бы одно из значений справа равно NULL, конструкция NOT IN возвращает NULL, а не true, как можно было бы наивно полагать. Это соответствует принятым в SQL правилам сравнения переменных со значениями NULL.

> Подсказка
Выражения x NOT IN y и NOT (x IN y) полностью равнозначны. Учитывая, что значения NULL могут ввести в заблуждение начинающих скорее в конструкции NOT IN, чем в IN, лучше формулировать условия так, чтобы в них было как можно меньше отрицаний.

### 9.23.3. ANY/SOME (с массивом)
    выражение оператор ANY (выражение массива)
    выражение оператор SOME (выражение массива)
Справа в скобках записывается выражение, результатом которого является массив. Вычисленное значение левого выражения сравнивается с каждым элементом этого массива с применением заданного оператора условия, который должен выдавать логическое значение. Результатом ANY будет «true», если для какого-либо элемента условие истинно, и «false» в противном случае (в том числе, и когда массив оказывается пустым).

Если значением массива оказывается NULL, результатом ANY также будет NULL. Если NULL получен в левой части, результатом ANY обычно тоже будет NULL (хотя оператор нестрогого сравнения может выдать другой результат). Кроме того, если массив в правой части содержит элементы NULL и ни c одним из элементов условие не выполняется, результатом ANY будет NULL, а не false (опять же, если используется оператор строгого сравнения). Это соответствует принятым в SQL правилам сравнения переменных со значениями NULL.

Ключевое слово SOME является синонимом ANY.

### 9.23.4. ALL (с массивом)
    выражение оператор ALL (выражение массива)
Справа в скобках записывается выражение, результатом которого является массив. Вычисленное значение левого выражения сравнивается с каждым элементом этого массива с применением заданного оператора условия, который должен выдавать логическое значение. Результатом ALL будет «true», если для всех элементов условие истинно (или массив не содержит элементов), и «false», если находятся строки, для которых оно ложно.

Если значением массива оказывается NULL, результатом ALL также будет NULL. Если NULL получен в левой части, результатом ALL обычно тоже будет NULL (хотя оператор нестрогого сравнения может выдать другой результат). Кроме того, если массив в правой части содержит элементы NULL и при этом нет элементов, с которыми условие не выполняется, результатом ALL будет NULL, а не true (опять же, если используется оператор строгого сравнения). Это соответствует принятым в SQL правилам сравнения переменных со значениями NULL.

### 9.23.5. Сравнение конструкторов строк
    конструктор_строки оператор конструктор_строки
С обеих сторон представлены конструкторы строк (они описываются в Подразделе 4.2.13). При этом данные строки должны содержать одинаковое число полей. После вычисления каждой стороны они сравниваются по строкам. Сравнения конструкторов строк возможны с оператором =, <>, <, <=, > или >=. Каждый элемент строки должен иметь тип, для которого определён класс операторов B-дерева; в противном случае при попытке сравнения может возникнуть ошибка.

> Примечание
Ошибок, связанных с числом или типов элементов, не должно быть, если сравнение выполняется с ранее полученными столбцами.

Сравнения = и <> несколько отличаются от других. С этими операторами две строки считаются равными, если все их соответствующие поля не равны NULL и равны между собой, и неравными, если какие-либо соответствующие их поля не NULL и не равны между собой. В противном случае результатом сравнения будет неопределённость (NULL).

С операторами <, <=, > и >= элементы строк сравниваются слева направо до тех пор, пока не будет найдена пара неравных элементов или значений NULL. Если любым из элементов пары оказывается NULL, результатом сравнения будет неопределённость (NULL), в противном случае результат всего выражения определяется результатом сравнения этих двух элементов. Например, результатом ROW(1,2,NULL) < ROW(1,3,0) будет true, а не NULL, так как третья пара элементов не принимается в рассмотрение.

> Примечание
До версии 8.2 PostgreSQL обрабатывал условия <, <=, > и >= не так, как это описано в стандарте SQL. Сравнение ROW(a,b) < ROW(c,d) выполнялось как a < c AND b < d, тогда как по стандарту должно быть a < c OR (a = c AND b < d).

    конструктор_строки IS DISTINCT FROM конструктор_строки
Эта конструкция похожа на сравнение строк с оператором <>, но со значениями NULL она выдаёт не NULL. Любое значение NULL для неё считается неравным (отличным от) любому значению не NULL, а два NULL считаются равными (не различными). Таким образом, результатом такого выражения будет true или false, но не NULL.

    конструктор_строки IS NOT DISTINCT FROM конструктор_строки
Эта конструкция похожа на сравнение строк с оператором =, но со значениями NULL она выдаёт не NULL. Любое значение NULL для неё считается неравным (отличным от) любому значению не NULL, а два NULL считаются равными (не различными). Таким образом, результатом такого выражения всегда будет true или false, но не NULL.

### 9.23.6. Сравнение составных типов
    запись оператор запись
Стандарт SQL требует, чтобы при сравнении строк возвращался NULL, если результат зависит от сравнения двух значений NULL или значения NULL и не NULL. Postgres Pro выполняет это требование только при сравнении строк, созданных конструкторами (как описано в Подразделе 9.23.5), или строки, созданной конструктором, со строкой результата подзапроса (как было описано в Разделе 9.22). В других контекстах при сравнении полей составных типов два значения NULL считаются равными, а любое значение не NULL полагается меньшим NULL. Это отклонение от правила необходимо для полноценной реализации сортировки и индексирования составных типов.

После вычисления каждой стороны они сравниваются по строкам. Сравнения составных типов возможны с оператором =, <>, <, <=, > или >=, либо другим подобным. (Точнее, оператором сравнения строк может быть любой оператор, входящий в класс операторов B-дерева, либо обратный к оператору =, входящему в класс операторов B-дерева.) По умолчанию вышеперечисленные операторы действуют так же, как выражение IS [ NOT ] DISTINCT FROM для конструкторов строк (см. Подраздел 9.23.5).

Для поддержки сравнения строк с элементами, для которых не определён класс операторов B-дерева по умолчанию, введены следующие операторы: *=, *<>, *<, *<=, *> и *>=. Эти операторы сравнивают внутреннее двоичное представление двух строк. Учтите, что две строки могут иметь различное двоичное представление, даже когда при сравнении оператором равенства считаются равными. Порядок строк с такими операторами детерминирован, но не несёт смысловой нагрузки. Данные операторы применяются внутри системы для материализованных представлений и могут быть полезны для других специальных целей (например, репликации), но, вообще говоря, не предназначены для использования в обычных запросах.

## 9.24. Функции, возвращающие множества
В этом разделе описаны функции, которые могут возвращать не одну, а множество строк. Чаще всего из их числа используются функции, генерирующие ряды значений, которые перечислены в Таблице 9.61 и Таблице 9.62. Другие, более специализированные функции множеств описаны в других разделах этой документации. Варианты комбинирования нескольких функций, возвращающих множества строк, описаны в Подразделе 7.2.1.4.

Таблица 9.61. Функции, генерирующие ряды значений

| Функция                                  | Тип аргумента                            | Тип результата                           | Описание                                 |
|------------------------------------------|------------------------------------------|------------------------------------------|------------------------------------------|
| <code class="literal" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;"><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">generate_series(<em class="parameter" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">start</code></em>,<span> </span><em class="parameter" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">stop</code></em>)</code></code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">int</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bigint</code><span> </span>или<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">numeric</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">setof int</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">setof bigint</code><span> </span>или<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">setof numeric</code><span> </span>(определяется типом аргумента) | Выдаёт ряд целых чисел от<span> </span><em class="parameter" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">start</code></em><span> </span>до<span> </span><em class="parameter" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">stop</code></em><span> </span>с шагом 1 |
| <code class="literal" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;"><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">generate_series(<em class="parameter" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">start</code></em>,<span> </span><em class="parameter" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">stop</code></em>,<span> </span><em class="parameter" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">step</code></em>)</code></code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">int</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">bigint</code><span> </span>или<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">numeric</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">setof int</code>,<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">setof bigint</code><span> </span>или<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">setof numeric</code><span> </span>(определяется типом аргумента) | Выдаёт ряд значений от<span> </span><em class="parameter" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">start</code></em><span> </span>до<span> </span><em class="parameter" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">stop</code></em><span> </span>с заданным шагом (<em class="parameter" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">step</code></em>) |
| <code class="literal" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;"><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">generate_series(<em class="parameter" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">start</code></em>,<span> </span><em class="parameter" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">stop</code></em>,<span> </span><em class="parameter" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">step</code></em><span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">interval</code>)</code></code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">timestamp</code><span> </span>или<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">timestamp with time zone</code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">setof timestamp</code><span> </span>или<span> </span><code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">setof timestamp with time zone</code><span> </span>(определяется типом аргумента) | Выдаёт ряд значений от<span> </span><em class="parameter" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">start</code></em><span> </span>до<span> </span><em class="parameter" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">stop</code></em><span> </span>с заданным шагом (<em class="parameter" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">step</code></em>) |


Если заданный шаг (step) положительный, а start оказывается больше stop, эти функции возвращают 0 строк. Тот же результат будет, если step меньше 0, а start меньше stop, или если какой-либо аргумент равен NULL. Если же step будет равен 0, произойдёт ошибка. Несколько примеров:

    SELECT * FROM generate_series(2,4);
     generate_series
    -----------------
                   2
                   3
                   4
    (3 rows)
    
    SELECT * FROM generate_series(5,1,-2);
     generate_series
    -----------------
                   5
                   3
                   1
    (3 rows)
    
    SELECT * FROM generate_series(4,3);
     generate_series
    -----------------
    (0 rows)
    
    SELECT generate_series(1.1, 4, 1.3);
     generate_series 
    -----------------
                 1.1
                 2.4
                 3.7
    (3 rows)
    
    -- этот пример задействует оператор прибавления к дате целого числа
    SELECT current_date + s.a AS dates FROM generate_series(0,14,7) AS s(a);
       dates
    ------------
     2004-02-05
     2004-02-12
     2004-02-19
    (3 rows)
    
    SELECT * FROM generate_series('2008-03-01 00:00'::timestamp,
                                  '2008-03-04 12:00', '10 hours');
       generate_series   
    ---------------------
     2008-03-01 00:00:00
     2008-03-01 10:00:00
     2008-03-01 20:00:00
     2008-03-02 06:00:00
     2008-03-02 16:00:00
     2008-03-03 02:00:00
     2008-03-03 12:00:00
     2008-03-03 22:00:00
     2008-03-04 08:00:00
    (9 rows)
Таблица 9.62. Функции, генерирующие индексы массивов

| Функция                                  | Тип результата                           | Описание                                 |
|------------------------------------------|------------------------------------------|------------------------------------------|
| <code class="literal" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;"><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">generate_subscripts(<em class="parameter" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">array anyarray</code></em>,<span> </span><em class="parameter" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">dim int</code></em>)</code></code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">setof int</code> | Выдаёт ряд значений для использования в качестве индекса данного массива. |
| <code class="literal" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;"><code class="function" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">generate_subscripts(<em class="parameter" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">array anyarray</code></em>,<span> </span><em class="parameter" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">dim int</code></em>,<span> </span><em class="parameter" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">reverse boolean</code></em>)</code></code> | <code class="type" style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">setof int</code> | Выдаёт ряд значений для использования в качестве индекса данного массива. Если параметр<span> </span><em class="parameter" style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: monospace, monospace; font-size: 1em; padding: 0px; color: rgb(82, 95, 108); background-color: rgb(255, 255, 255); border-radius: 0px;">reverse</code></em><span> </span>равен true, значения выдаются от большего к меньшему. |


Функция generate_subscripts позволяет упростить получение всего набора индексов для указанной размерности заданного массива. Она выдаёт 0 строк, если в массиве нет указанной размерности или сам массив равен NULL (хотя для элементов, равных NULL, индексы будут выданы, как и для любых других). Взгляните на следующие примеры:

    -- простой пример использования
    SELECT generate_subscripts('{NULL,1,NULL,2}'::int[], 1) AS s;
     s 
    ---
     1
     2
     3
     4
    (4 rows)
    
    -- для показанного массива получение индекса и обращение
    -- к элементу по индексу выполняется с помощью подзапроса
    SELECT * FROM arrays;
             a          
    --------------------
     {-1,-2}
     {100,200,300}
    (2 rows)
    
    SELECT a AS array, s AS subscript, a[s] AS value
    FROM (SELECT generate_subscripts(a, 1) AS s, a FROM arrays) foo;
         array     | subscript | value
    ---------------+-----------+-------
     {-1,-2}       |         1 |    -1
     {-1,-2}       |         2 |    -2
     {100,200,300} |         1 |   100
     {100,200,300} |         2 |   200
     {100,200,300} |         3 |   300
    (5 rows)
    
    -- разворачивание двумерного массива
    CREATE OR REPLACE FUNCTION unnest2(anyarray)
    RETURNS SETOF anyelement AS $$
    select $1[i][j]
       from generate_subscripts($1,1) g1(i),
            generate_subscripts($1,2) g2(j);
    $$ LANGUAGE sql IMMUTABLE;
    CREATE FUNCTION
    SELECT * FROM unnest2(ARRAY[[1,2],[3,4]]);
     unnest2 
    ---------
           1
           2
           3
           4
    (4 rows)
    Когда после функции в предложении FROM добавляется WITH ORDINALITY, в выходные данные добавляется столбец типа bigint, числа в котором начинаются с 1 и увеличиваются на 1 для каждой строки, выданной функцией. В первую очередь это полезно для функций, возвращающих множества, например, unnest().
    
    -- функция, возвращающая множество, с нумерацией
    SELECT * FROM pg_ls_dir('.') WITH ORDINALITY AS t(ls,n);
           ls        | n
    -----------------+----
     pg_serial       |  1
     pg_twophase     |  2
     postmaster.opts |  3
     pg_notify       |  4
     postgresql.conf |  5
     pg_tblspc       |  6
     logfile         |  7
     base            |  8
     postmaster.pid  |  9
     pg_ident.conf   | 10
     global          | 11
     pg_xact         | 12
     pg_snapshots    | 13
     pg_multixact    | 14
     PG_VERSION      | 15
     pg_wal          | 16
     pg_hba.conf     | 17
     pg_stat_tmp     | 18
     pg_subtrans     | 19
    (19 строк)
    
